package cn.hive.lianxi;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class UDAF_02_max extends UDAF {

	public static class Evaluator implements UDAFEvaluator {

		// 用来记录max最后的数值
		private double max;

		// 构造方法,用来创建内部静态类的对象
		public Evaluator() {
			init();
		}

		// 用来初始化 count 的值
		@Override
		public void init() {
			max = 0.0;
		}

		/**
		 * 迭代器 -- Mapper:map()
		 * 
		 * 用来统计map阶段拿到的信息
		 * 
		 * @param input
		 * @return
		 */
		public boolean iterate(String input) {
			if (input == null) {
				return false;
			}
			String[] arr = input.split("\t");
			if (max < Double.parseDouble(arr[3])) {
				max = Double.parseDouble(arr[3]);
			}
			return true;
		}

		/**
		 * Mapper -- combiner -- map output
		 * 
		 * 类似于combiner,在map范围内做部分聚合，将结果传给merge函数中的形参mapOutput
		 * 如果需要聚合，则对iterator返回的结果处理，否则直接返回iterator的结果即可
		 * 
		 * @return
		 */
		public double terminatePartial() {
			return max;
		}

		/**
		 * Reducer -- merge
		 * 
		 * reduce 阶段，用于逐个迭代处理map当中每个不同key对应的 terminatePartial的结果
		 * 
		 * @param mapOutput
		 * @return
		 */
		public boolean merge(double mapOutput) {
			return true;
		}

		/**
		 * Reducer -- out put
		 * 
		 * 处理merge计算完成后的结果，此时的count在merge完成时候，结果已经得出，无需再进一次对整体结果做处理，故直接返回即可
		 * 
		 * @return
		 */
		public double terminate() {
			return max;
		}
	}
}
